// 测试JavaScript中的变量

// 用 var 定义变量
var username; // 若为显式为变量赋值则默认是`undefined`
console.log('username: ', username); // `undefined`
username = 'afang';
console.log('username: ', username); // `afang`

var username = 'lifang';
console.log('username: ', username);

// 变量声明被前置( var password; )
console.log('password: ', password); // 'undefined'
// 到这一步才会为已经声明的变量赋值
var password = 'hello';
console.log('password: ', password); // 'hello'

console.log( '- - - - - - - - - - - -' );

// 用 let 定义变量
let nickname = '阿芳';
console.log('nickname: ', nickname);

// SyntaxError: Identifier 'nickname' has already been declared
// let nickname = '小芳';

// ReferenceError: Cannot access 'captcha' before initialization
// console.log('captcha: ', captcha);
// 用 let 声明的变量也会被前置(即变量声明被前置)
// 但是，因为`暂时性死区`在源代码中定义变量之前不可以访问变量
let captcha = 'xaby';
console.log('captcha: ', captcha);

console.log( '- - - - - - - - - - - -' );

// ReferenceError: Cannot access 'PI' before initialization
// console.log('PI: ' , PI);
const PI = 3.1415926;
console.log('PI: ' , PI);

// PI = 3.142; // TypeError: Assignment to constant variable.

// 使用原则:
// 定义变量能使用 const 就不使用 let ，能使用 let 就不使用 var

// 面试题:
// var、let、const区别 (答区别前先答共同点)